/**************************************************************************//**
 * @item     CosyOS-III Hook
 * @file     debug_hook.c
 * @brief    DEBUG钩子
 * @details  在系统调试任务中被调用，用户可自行实现DEBUG信息的输出。
 * @author   迟凯峰
 * @version  V1.2.0
 * @date     2025.03.30
 ******************************************************************************/

#include "CosyOS.H"
#if SYSCFG_DEBUGGING == __ENABLED__

#define USER_DEBUGSENDTYPE   0  // DEBUG发送方式（0：中断方式；1：查询打印方式）
#define USER_DEBUGRECVBUFF   32 // DEBUG接收缓存SIZE
char  u_debug_recvbuff[USER_DEBUGRECVBUFF];
char *u_debug_recvptr = u_debug_recvbuff;
char *u_debug_sendptr;

#if SYSCFG_DEBUG_SENDLEN == __DISABLED__
__WEAK void debug_hook(char *p)
#else
__WEAK void debug_hook(char *p, size_t len)
#endif
{
	/* debug send 中断方式 */
	#if USER_DEBUGSENDTYPE == 0
	u_debug_sendptr = p;
	S2TI = 1;
	
	/* debug send 查询打印方式 */
	#else
	#include <stdio.h>
	printf("%s", p);
	xDebugSend_Complete(); // 调用服务
	#endif
}

void UART2_Isr(void) interrupt 8
{
	/* debug send 中断方式 */
	#if USER_DEBUGSENDTYPE == 0
	if(S2TI){
		S2TI = 0;
		if(*u_debug_sendptr){
			S2BUF = *u_debug_sendptr++;
		}
		else{
			xDebugSend_Complete(); // 调用服务
		}
	}
	#endif
	/* debug recv 中断方式 */
	if(S2RI){
		S2RI = 0;
		if(u_debug_recvptr - u_debug_recvbuff < USER_DEBUGRECVBUFF - 1){
			*u_debug_recvptr = S2BUF;
			if(*u_debug_recvptr++ == '\n'){
				xDebugRecv_Handler(u_debug_recvbuff, u_debug_recvptr - u_debug_recvbuff); // 调用服务
				u_debug_recvptr = u_debug_recvbuff;
			}
		}
	}
}

#endif
